package com.Szjcyh.Until;

import java.util.List;

import net.sf.json.JSON;
import net.sf.json.JSONSerializer;
import net.sf.json.xml.XMLSerializer;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * Created by chengsheng on 2015/8/19.
 */
public class TestXml2Json {
    public static void main(String[] args) throws Exception {
        
        String xmlStr="<MEBS_MOBILE>"+
    			"<REQ name=\"openaccount_apply\">"+
    				"<Name>姓名</Name>"+
    				"<FullName>交易商全称</FullName>"+
    				"<Type>交易商类型 1：企业2：代理3：个人</Type>"+
    				"<ContactMan>联系人</ContactMan>"+
    				"<CertificateType>证件类型 </CertificateType>"+
    				"<CertificateNO>证件号码</CertificateNO>"+
    				"<Mobile>联系人手机号</Mobile>"+
    				"<Phone>联系人电话</Phone>"+
    				"<Bank>开户银行12：中行13：建行15：招行18：平安005：农行</Bank>"+
    				"<BankAccount>银行帐号</BankAccount>"+
    				"<Fax>传真</Fax>"+
    				"<Address>地址</Address>"+
    				"<Email>电子邮箱</Email>"+
    				"<PostCode>邮政编码</PostCode>"+
    				"<BrokerId>开户机构</BrokerId>"+
    				"<BrokerAgeId>居间商</BrokerAgeId>"+
    				"<Picture>身份证正面照(格式：jpeg.jpg,gif,png,bmp)</Picture>"+
    				"<IndustryCode>所属行业编码</IndustryCode>"+
    				"<OrganizationCode>组织机构代码</OrganizationCode>"+
    				"<CorporateRepresentative>法人代表</CorporateRepresentative>"+
    			"</REQ>"+
    		"</MEBS_MOBILE>";
        Document doc= DocumentHelper.parseText(xmlStr);
        JSONObject json=new JSONObject();
        dom4j2Json(doc.getRootElement(),json);
        System.out.println("xml2Json:"+json.toJSONString());
        
        String json2= jsontoXml(json.toJSONString());
        System.out.println("Json2xml:"+json2);
        
    }
    public static String jsontoXml(String json)
    {
    	return jsontoXml(json,"MEBS_MOBILE");
    }
    public static String jsontoXml(String json,String rootName) {  
        try {  
            XMLSerializer serializer = new XMLSerializer();
            serializer.setRootName(rootName);
            serializer.setTypeHintsEnabled(false);
            JSON jsonObject = JSONSerializer.toJSON(json);  
            return serializer.write(jsonObject);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    } 
    
     /**
     * xml转json
     * @param xmlStr
     * @return
     * @throws DocumentException
     */
    public static JSONObject xml2Json(String xmlStr) throws DocumentException{
        Document doc= DocumentHelper.parseText(xmlStr);
        JSONObject json=new JSONObject();
        dom4j2Json(doc.getRootElement(), json);
        return json;
    }


    /**
     * xml转json
     * @param element
     * @param json
     */
    public static void dom4j2Json(Element element,JSONObject json){
        //如果是属性
        for(Object o:element.attributes()){
            Attribute attr=(Attribute)o;
            if(!isEmpty(attr.getValue())){
                json.put("@"+attr.getName(), attr.getValue());
            }
        }
        List<Element> chdEl=element.elements();
        if(chdEl.isEmpty()&&!isEmpty(element.getText())){//如果没有子元素,只有一个值
            json.put(element.getName(), element.getText());
        }

        for(Element e:chdEl){//有子元素
            if(!e.elements().isEmpty()){//子元素也有子元素
                JSONObject chdjson=new JSONObject();
                dom4j2Json(e,chdjson);
                Object o=json.get(e.getName());
                if(o!=null){
                    JSONArray jsona=null;
                    if(o instanceof JSONObject){//如果此元素已存在,则转为jsonArray
                        JSONObject jsono=(JSONObject)o;
                        json.remove(e.getName());
                        jsona=new JSONArray();
                        jsona.add(jsono);
                        jsona.add(chdjson);
                    }
                    if(o instanceof JSONArray){
                        jsona=(JSONArray)o;
                        jsona.add(chdjson);
                    }
                    json.put(e.getName(), jsona);
                }else{
                    if(!chdjson.isEmpty()){
                        json.put(e.getName(), chdjson);
                    }
                }


            }else{//子元素没有子元素
                for(Object o:element.attributes()){
                    Attribute attr=(Attribute)o;
                    if(!isEmpty(attr.getValue())){
                        json.put("@"+attr.getName(), attr.getValue());
                    }
                }
                if(!e.getText().isEmpty()){
                    json.put(e.getName(), e.getText());
                }
            }
        }
    }

    public static boolean isEmpty(String str) {

        if (str == null || str.trim().isEmpty() || "null".equals(str)) {
            return true;
        }
        return false;
    }
}
